#include "lambdamethod.h"
#include <iostream>
using namespace std;

LambdaMethod::LambdaMethod()
{

}

void LambdaMethod::show(){
    cout << endl << endl;
    cout << "lambda表达式==============================================="<< endl;

    //lambda表达式，返回一个int类型的数字
    auto getint = [](){ return 100; };
    //调用函数
    int i = getint();

    cout << "getint = " << i << endl;

    // 传递参数
    auto getint1 = [](int i, int j){ return i+j; };
    cout << "getint1 = " << getint1(2,3) << endl;

    // 传递指针
    {
        int a = 100;
        int b = 200;
        int *pa = &a;
        int *pb = &b;

        auto getint2 = [](int *a, int *b){ return *a + *b; };
        int result2 = getint2(pa, pb);

        cout << "getint2 = " << result2 << endl;
    }

    //[]的作用，捕获列表
    {
        string str = "欢迎使用匿名函数";

        //1、如果要在匿名函数内部访问外部变量，需要在[]内声明捕捉,这个叫捕获列表
        //2、捕捉可以使用 = &符号来修饰
        //3、如果捕获列表中的参数没有修饰符，默认表示传值，只能使用这个捕获参数的值，不能修改这个原值。
        //4、如果捕获的值使用&符号修饰，不仅可以在函数内部使用这个值，还可以修改这个变量的值

        auto add = [&str](int a, int b){
            cout << str << endl;
            str = "你好";
            return a+b;
        };

        cout << "add = " << add(5, 6) << endl;
        cout << str << endl;
    }

    //混合捕获
    {
        int a=10, b=20, c=30;
        auto f = [=, &c]{
            c++;
            return a+b;
        };

        cout << "f = " << f() << endl;
    }
}
